home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
macros
/
latex209
/
contrib
/
textyl
/
src
/
io.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-07
|
6KB
|
348 lines
#include "defs.h"
#include "globals.h"
static struct DVIBuftype
{
int32 TotByteLen, curstrindex;
int32 maxlen;
short *Dstring;
} GDVIBuf;
/*
* NOTATION:: All procedures that put a dvi-command into the temporary buffer are prefixed with "cmd"... Functions that deal
* with reading .tfm files are prefixed with "T" or have "tfm" in their names. Functions that deal with reading DVI files are
* prefixed with a "D".
*/
/*--------------------------------------------*/
void
cmd1byte(cmd)
int32 cmd;
{
char *realloc PP((char *, unsigned));
if (GDVIBuf.curstrindex >= GDVIBuf.maxlen)
{ /* buffer full */
GDVIBuf.maxlen *= 2;
GDVIBuf.Dstring = (short *) realloc((char *)GDVIBuf.Dstring, (unsigned)sizeof(*GDVIBuf.Dstring) * GDVIBuf.maxlen);
}
GDVIBuf.Dstring[GDVIBuf.curstrindex] = cmd;
/* insert command byte */
GDVIBuf.TotByteLen++;
GDVIBuf.curstrindex++;
}
/*---------------------------------------------------*/
void
cmd2byte(cmd)
int32 cmd;
{
cmd1byte((cmd >> 8) & 0xff);
cmd1byte(cmd & 0xff);
}
/*---------------------------------------------------*/
void
cmd4byte(cmd)
int32 cmd;
{
cmd1byte((cmd >> 24) & 0xff);
cmd1byte((cmd >> 16) & 0xff);
cmd1byte((cmd >> 8) & 0xff);
cmd1byte(cmd & 0xff);
}
/*---------------------------------------------------*/
/*
* ### may be system dependent as integers are assumed to be signed 32-bits
*/
void
cmdSigned(i, numbytes)
int32 i, numbytes;
{
int32 tmp;
if (numbytes == 4)
{
cmd4byte(i);
return;
}
tmp = i;
if (numbytes == 3)
{
if (tmp < 0)
tmp += TWO24;
cmd1byte(tmp / TWO16);
tmp &= TWO16 - 1;
cmd1byte(tmp / 256);
}
if (numbytes == 2)
{
if (tmp < 0)
tmp += TWO16;
cmd1byte(tmp / 256);
}
if (numbytes == 1)
{
if (tmp < 0)
tmp += 256;
}
cmd1byte(tmp & 255); /* for all */
/* <= 3 bytes */
}
/*---------------------------------------------------*/
int
Tgetc()
{
int c;
if ((c = getc(tfmfile)) == EOF)
{
complain(ERRREALBAD);
fprintf(logfile, " early EOF of tfm file! \n");
return (0);
}
return (c & 0xff);
}
/*---------------------------------------------------*/
void
readtfmword()
{
b0 = Tgetc();
b1 = Tgetc();
b2 = Tgetc();
b3 = Tgetc();
}
/*---------------------------------------------------*/
int32
Dgetc()
{
int c;
if ((c = getc(dvifile)) == EOF)
return (0);
return (c & 0xff);
}
/*---------------------------------------------------*/
int32
Dget1byte()
{
int c;
if ((c = getc(dvifile)) == EOF)
return (0);
else
{
cmd1byte(c);
return (c & 0xff);;
}
}
/*---------------------------------------------------*/
int32
Dsign1byte()
{
int32 c;
c = Dgetc();
if (c >= 128)
c -= 256;
cmd1byte(c);
return (c);
}
/*---------------------------------------------------*/
int32
Dget2byte()
{
int32 a, b;
a = Dgetc();
b = Dgetc();
cmd1byte(a);
cmd1byte(b);
return ((a << 8) | b);
}
/*---------------------------------------------------*/
int32
Dsign2byte()
{
int32 a, b;
a = Dgetc();
b = Dgetc();
cmd1byte(a);
cmd1byte(b);
if (a < 128)
return ((a >> 8) | b);
else
return ((a - 256) * 256 + b);
}
/*---------------------------------------------------*/
int32
Dget3byte()
{
int32 a, b, c;
a = Dgetc();
b = Dgetc();
c = Dgetc();
cmd1byte(a);
cmd1byte(b);
cmd1byte(c);
return ((a << 16) | (b << 8) | c);
}
/*---------------------------------------------------*/
int32
Dsign3byte()
{
int32 a, b, c;
a = Dgetc();
b = Dgetc();
c = Dgetc();
cmd1byte(a);
cmd1byte(b);
cmd1byte(c);
if (a < 128)
return ((a << 16) | (b << 8) | c);
else
return ((a - 256) * 256 + b) * 256 + c;
}
/*---------------------------------------------------*/
int32
Dsign4byte()
{
int32 a, b, c, d;
a = Dgetc();
b = Dgetc();
c = Dgetc();
d = Dgetc();
cmd1byte(a);
cmd1byte(b);
cmd1byte(c);
cmd1byte(d);
if (a < 128)
return (((a * 256 + b) * 256 + c) * 256 + d);
else
return ((((a - 256) * 256 + b) * 256 + c) * 256 + d);
}
/*---------------------------------------------------*/
/*
* write a byte out to the ouput file, but if we encounter the font flag, define the new fonts, and continue
*/
void
OutputByte(b)
int32 b;
{
if (b == OURFONTFLAG)
{ /* our special macro-flag */
b = NOP; /* nullify it */
if (!didnewfonts)
{
didnewfonts = true;
defineNewfonts(); /* expand the defns in the outfile itself */
}
} /* if */
putc(b, outputfil);
TotBytesWritten++; /* keep count of all bytes */
}
/*---------------------------------------------------*/
void
Output2Byte(i)
int32 i;
{
OutputByte((i >> 8) & 0xff);
OutputByte(i & 0xff);
}
/*---------------------------------------------------*/
void
Output4Byte(i)
int32 i;
{
OutputByte((i >> 24) & 0xff);
OutputByte((i >> 16) & 0xff);
OutputByte((i >> 8) & 0xff);
OutputByte(i & 0xff);
}
/*---------------------------------------------------*/
void
InitDVIBuf()
{
GDVIBuf.maxlen = 2048;
GDVIBuf.Dstring = (short *) xmalloc(sizeof(*GDVIBuf.Dstring) * 2048);
GDVIBuf.TotByteLen = 0;
GDVIBuf.curstrindex = 0;
}
/*---------------------------------------------------*/
void
ClearDVIBuf()
{
GDVIBuf.TotByteLen = 0;
GDVIBuf.curstrindex = 0;
}
/*---------------------------------------------------*/
void
WriteDVIBuf()
{
int32 i;
int32 b;
for (i = 0; i < GDVIBuf.curstrindex; i++)
{
b = GDVIBuf.Dstring[i];
OutputByte(b);
}
ClearDVIBuf();
}
/*---------------------------------------------------*/
void
BackupInBuf(nbytes)
int nbytes;
{
GDVIBuf.curstrindex -= nbytes; /* points to position to-be-filled */
GDVIBuf.TotByteLen -= nbytes;
}
/*-----------------------------------------------------*/
int32
DVIMark()
{
return (GDVIBuf.TotByteLen);
}